home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_11
/
9n11052a
< prev
next >
Wrap
Text File
|
1991-09-23
|
12KB
|
354 lines
/* -- simpwalk.h --
*/
#define LEGDOWN_CYCLE_TIME 50
#define ALPHA_ADVANCE_CYCLE_TIME 10
#define GAIT_CYCLE_TIME 500
typedef enum { ALPHA_DECR = -1, NEUTRAL, ALPHA_INCR } POSITION;
#define BETA_UP 127
#define BETA_DOWN -128
#define IS_BETA_UP(x) !IS_BETA_DOWN(x)
#define IS_BETA_DOWN(x) ((x) < 0)
typedef struct
{
char *inName;
char *outName;
int servoName;
} IO_NAME;
extern IO_NAME alphaData[], betaData[];
void alphaPos(void), betaPos(void);
/* -- standup.c --
*/
#include <stdio.h>
#include "exec.h"
#include "simpwalk.h"
#define alpha0Servo 0
#define alpha1Servo 1
#define alpha2Servo 2
#define alpha3Servo 3
#define alpha4Servo 4
#define alpha5Servo 5
#define beta0Servo 6
#define beta1Servo 7
#define beta2Servo 8
#define beta3Servo 9
#define beta4Servo 10
#define beta5Servo 11
IO_NAME alphaData[] = {
{ "alpha0Pos.in", "alpha0Pos.out", alpha0Servo },
{ "alpha1Pos.in", "alpha1Pos.out", alpha1Servo },
{ "alpha2Pos.in", "alpha2Pos.out", alpha2Servo },
{ "alpha3Pos.in", "alpha3Pos.out", alpha3Servo },
{ "alpha4Pos.in", "alpha4Pos.out", alpha4Servo },
{ "alpha5Pos.in", "alpha5Pos.out", alpha5Servo }
};
IO_NAME betaData[] = {
{ "beta0Pos.in", "beta0Pos.out", beta0Servo },
{ "beta1Pos.in", "beta1Pos.out", beta1Servo },
{ "beta2Pos.in", "beta2Pos.out", beta2Servo },
{ "beta3Pos.in", "beta3Pos.out", beta3Servo },
{ "beta4Pos.in", "beta4Pos.out", beta4Servo },
{ "beta5Pos.in", "beta5Pos.out", beta5Servo }
};
/* alpha position. One per leg.
*/
void alphaPos(void)
{
IO_NAME *pData = &alphaData[ExecArg0];
PORT portValue, position;
STRING_ATOM output = StringToAtom(pData->outName);
MsgOpenPort(output, &portValue);
MsgWriteToPort(output,
servoWrite(pData->servoName, NEUTRAL));
MsgWatchPort(StringToAtom(pData->inName), &position);
while (MsgGetMsg())
{
MsgWriteToPort(output,
servoWrite(pData->servoName, position));
}
}
/* beta position. One per leg.
*/
void betaPos(void)
{
IO_NAME *pData = &betaData[ExecArg0];
EXEC_ID id, timerID;
PORT currentPos, portValue, position;
STRING_ATOM output = StringToAtom(pData->outName);
MsgOpenPort(output, &portValue);
MsgWriteToPort(output, BETA_DOWN);
servoWrite(pData->servoName, position = BETA_DOWN);
while (servoReadWrite(pData->servoName, position) != BETA_DOWN)
;
MsgWatchPort(StringToAtom(pData->inName), &position);
timerID = MsgWatchTimer(1);
while (id = MsgGetMsg())
{
if (id == timerID)
MsgWriteToPort(output,
servoReadWrite(pData->servoName, position));
else
servoWrite(pData->servoName, position);
}
}
/* -- simpwalk.c --
*/
#include <stdlib.h>
#include "exec.h"
#include "simpwalk.h"
/* interface names
*/
IO_NAME legDownData[] = {
{ "leg0Down.in", "leg0Down.out" },
{ "leg1Down.in", "leg1Down.out" },
{ "leg2Down.in", "leg2Down.out" },
{ "leg3Down.in", "leg3Down.out" },
{ "leg4Down.in", "leg4Down.out" },
{ "leg5Down.in", "leg5Down.out" }
};
IO_NAME advanceData[] = {
{ "alpha0Advance.in", "alpha0Advance.out" },
{ "alpha1Advance.in", "alpha1Advance.out" },
{ "alpha2Advance.in", "alpha2Advance.out" },
{ "alpha3Advance.in", "alpha3Advance.out" },
{ "alpha4Advance.in", "alpha4Advance.out" },
{ "alpha5Advance.in", "alpha5Advance.out" }
};
IO_NAME uplegData[] = {
{ "upleg0Trigger.in", "upleg0Trigger.out" },
{ "upleg1Trigger.in", "upleg1Trigger.out" },
{ "upleg2Trigger.in", "upleg2Trigger.out" },
{ "upleg3Trigger.in", "upleg3Trigger.out" },
{ "upleg4Trigger.in", "upleg4Trigger.out" },
{ "upleg5Trigger.in", "upleg5Trigger.out" }
};
/* put the leg down if it's up. One per leg.
*/
void legDown(void)
{
IO_NAME *pData = &legDownData[ExecArg0];
PORT legPosition;
STRING_ATOM betaOut, output;
betaOut = StringToAtom(betaData[ExecArg0].outName);
output = StringToAtom(pData->outName);
/* connect our output to the beta position's input
*/
MsgConnectPorts(output, StringToAtom(betaData[ExecArg0].inName));
MsgWatchTimer(LEGDOWN_CYCLE_TIME);
while (MsgGetMsg())
{
MsgPeekPort(betaOut, &legPosition);
if (IS_BETA_UP(legPosition))
MsgWriteToPort(output, BETA_DOWN);
}
}
/* if the total alpha positions are positive, then move them back.
* If it is negative, move them forward. One for all legs.
*/
void alphaBalance(void)
{
STRING_ATOM alpha0, alpha1, alpha2, alpha3, alpha4, alpha5;
STRING_ATOM alphaOut;
PORT totalAlphaPosition;
alpha0 = StringToAtom(alphaData[0].outName);
alpha1 = StringToAtom(alphaData[1].outName);
alpha2 = StringToAtom(alphaData[2].outName);
alpha3 = StringToAtom(alphaData[3].outName);
alpha4 = StringToAtom(alphaData[4].outName);
alpha5 = StringToAtom(alphaData[5].outName);
alphaOut = StringToAtom("alphaBalance.out");
/* connect our output to the alpha motors' input
*/
MsgConnectPorts(alphaOut, StringToAtom(alphaData[0].inName));
MsgConnectPorts(alphaOut, StringToAtom(alphaData[1].inName));
MsgConnectPorts(alphaOut, StringToAtom(alphaData[2].inName));
MsgConnectPorts(alphaOut, StringToAtom(alphaData[3].inName));
MsgConnectPorts(alphaOut, StringToAtom(alphaData[4].inName));
MsgConnectPorts(alphaOut, StringToAtom(alphaData[5].inName));
MsgWatchTimer(ALPHA_ADVANCE_CYCLE_TIME);
while (MsgGetMsg())
{
totalAlphaPosition =
MsgPeekPort(alpha0, NULL) +
MsgPeekPort(alpha1, NULL) +
MsgPeekPort(alpha2, NULL) +
MsgPeekPort(alpha3, NULL) +
MsgPeekPort(alpha4, NULL) +
MsgPeekPort(alpha5, NULL);
if (totalAlphaPosition < 0)
MsgWriteToPort(alphaOut, ALPHA_INCR);
else if (0 < totalAlphaPosition)
MsgWriteToPort(alphaOut, ALPHA_DECR);
}
}
/* if the leg is up, then move leg forward. One per leg.
*/
void alphaAdvance(void)
{
PORT betaPosition;
STRING_ATOM input, output, alphaPosInput;
/* wakes up whenever the beta position changes
*/
input = StringToAtom(advanceData[ExecArg0].inName);
MsgWatchPort(input, &betaPosition);
alphaPosInput = StringToAtom(alphaData[ExecArg0].inName);
output = StringToAtom(advanceData[ExecArg0].outName);
/* change alpha position input to connect to our output
*/
MsgInhibitPorts(output, alphaPosInput);
MsgConnectPorts(StringToAtom(betaData[ExecArg0].outName), input);
while (MsgGetMsg())
{
if (IS_BETA_UP(betaPosition))
MsgWriteToPort(output, ALPHA_INCR);
}
}
/* if the leg is down, move it up
*/
void uplegTrigger(void)
{
PORT betaPosition;
STRING_ATOM betaInput, betaOutput, output;
betaInput = StringToAtom(bet